home *** CD-ROM | disk | FTP | other *** search
/ Mac Magazin/MacEasy 11 / Mac Magazin and MacEasy Magazine CD - Issue 11.iso / Sharewarebibliothek / Entwickler / WASTE 1.1b1 Distribution / WASTE Source / THINK specific / WESelectors.c < prev    next >
Text File  |  1995-05-17  |  5KB  |  191 lines

  1. /*
  2.  *    WESelectors.c
  3.  *
  4.  *    WASTE PROJECT
  5.  *    WEGetInfo / WESetInfo
  6.  *
  7.  *    Copyright (c) 1993-1995 Marco Piovanelli
  8.  *    All Rights Reserved
  9.  *
  10.  */
  11.  
  12. #ifndef WASTE_68K_ASSEMBLY
  13. #define WASTE_68K_ASSEMBLY 1L
  14. #endif
  15.  
  16. #define weUndefinedSelectorErr            -50 /* paramErr */
  17.  
  18. #define FIELD_OFFSET(FIELD, STRUCT)        (short) &((STRUCT *) 0L)->FIELD
  19. #define FIELD_SIZE(FIELD, STRUCT)        (short) sizeof(((STRUCT *) 0L)->FIELD)
  20. #define FIELD_DESC(FIELD, STRUCT)        { FIELD_OFFSET(FIELD, STRUCT), FIELD_SIZE(FIELD, STRUCT) }
  21.  
  22. typedef struct WEFieldDescriptor {
  23.     short fOffset;
  24.     short fLength;
  25. } WEFieldDescriptor;
  26.  
  27. typedef struct WELookupTable {
  28.     OSType selector;
  29.     WEFieldDescriptor desc;
  30. } WELookupTable;
  31.  
  32. pascal void _WELookupSelector(/*const*/ WELookupTable *table, OSType selector, WEFieldDescriptor *desc);
  33. pascal OSErr _WEGetField(/*const*/ WELookupTable *table, OSType selector, long *info, void *structure);
  34. pascal OSErr _WESetField(/*const*/ WELookupTable *table, OSType selector, long *info, void *structure);
  35.  
  36. typedef struct LongRect {
  37.     long top;
  38.     long left;
  39.     long bottom;
  40.     long right;
  41. } LongRect;
  42.  
  43. typedef struct    WERec {            /* version 1.1a5 */
  44.     GrafPtr port;
  45.     Handle hText;
  46.     Handle hLines;
  47.     Handle hStyles;
  48.     Handle hRuns;
  49.     long textLength;
  50.     long nLines;
  51.     long nStyles;
  52.     long nRuns;
  53.     LongRect viewRect;
  54.     LongRect destRect;
  55.     long selStart;
  56.     long selEnd;
  57.     unsigned long flags;
  58.     long caretTime;
  59.     long clickTime;
  60.     long clickLoc;
  61.     long anchorStart;
  62.     long anchorEnd;
  63.     ProcPtr clickLoop;
  64.     char unused1;
  65.     char clickEdge;
  66.     char unused2;
  67.     char firstByte;
  68.     GrafPtr offscreenPort;
  69.     RgnHandle viewRgn;
  70.     ProcPtr scrollProc;
  71.     short clickCount;    
  72.     char alignment;
  73.     long refCon;
  74.     Ptr tsmReference;
  75.     long tsmAreaStart;
  76.     long tsmAreaEnd;
  77.     ProcPtr tsmPreUpdate;
  78.     ProcPtr tsmPostUpdate;
  79.     long currentDrag;
  80.     long dragCaretOffset;
  81.     ProcPtr translateDragHook;
  82.     Handle hActionStack;
  83.     long modCount;
  84.     ProcPtr drawTextHook;
  85.     ProcPtr pixelToCharHook;
  86.     ProcPtr charToPixelHook;
  87.     ProcPtr lineBreakHook;
  88.     ProcPtr wordBreakHook;
  89.     ProcPtr charByteHook;
  90.     ProcPtr charTypeHook;
  91.     /* WERunAttributes nullStyle; */
  92. } WERec;
  93.  
  94. WELookupTable _WEMainSelectorTable[] = {
  95. { 'refc',     FIELD_DESC(refCon,            WERec) },
  96. { 'port',     FIELD_DESC(port,              WERec) },
  97. { 'text',     FIELD_DESC(hText,             WERec) },
  98. { 'c2p ',     FIELD_DESC(charToPixelHook,   WERec) },
  99. { 'cbyt',     FIELD_DESC(charByteHook,      WERec) },
  100. { 'ctyp',     FIELD_DESC(charTypeHook,      WERec) },
  101. { 'clik',     FIELD_DESC(clickLoop,         WERec) },
  102. { 'drag',     FIELD_DESC(currentDrag,       WERec) },
  103. { 'draw',     FIELD_DESC(drawTextHook,      WERec) },
  104. { 'lbrk',     FIELD_DESC(lineBreakHook,     WERec) },
  105. { 'line',     FIELD_DESC(hLines,            WERec) },
  106. { 'p2c ',     FIELD_DESC(pixelToCharHook,   WERec) },
  107. { 'post',     FIELD_DESC(tsmPostUpdate,     WERec) },
  108. { 'pre ',     FIELD_DESC(tsmPreUpdate,      WERec) },
  109. { 'runa',     FIELD_DESC(hRuns,             WERec) },
  110. { 'scrl',     FIELD_DESC(scrollProc,        WERec) },
  111. { 'styl',     FIELD_DESC(hStyles,           WERec) },
  112. { 'tsmd',     FIELD_DESC(tsmReference,      WERec) },
  113. { 'wbrk',     FIELD_DESC(wordBreakHook,     WERec) },
  114. { 'xdrg',     FIELD_DESC(translateDragHook, WERec) },
  115. { 0, 0, 0 }};
  116.  
  117. typedef struct WEOHTableElement {
  118.     OSType objectType;
  119.     ProcPtr newHandler;
  120.     ProcPtr freeHandler;
  121.     ProcPtr drawHandler;
  122.     ProcPtr clickHandler;
  123.     ProcPtr cursorHandler;
  124. } WEOHTableElement;
  125.  
  126. WELookupTable _WEObjectHandlerSelectorTable[] = {
  127. { 'clik',     FIELD_DESC(clickHandler,      WEOHTableElement) },
  128. { 'curs',     FIELD_DESC(cursorHandler,     WEOHTableElement) },
  129. { 'draw',     FIELD_DESC(drawHandler,       WEOHTableElement) },
  130. { 'free',     FIELD_DESC(freeHandler,       WEOHTableElement) },
  131. { 'new ',     FIELD_DESC(newHandler,        WEOHTableElement) },
  132. { 0, 0, 0 }};
  133.  
  134. pascal void _WELookupSelector(/*const*/ WELookupTable *table, OSType selector, WEFieldDescriptor *desc)
  135. {
  136.  
  137. #if WASTE_68K_ASSEMBLY
  138.  
  139.     asm {
  140.             move.l selector, d0            ; d0 = selector code to search
  141.             move.l table, a0            ; a0 = start of table
  142.             move.l desc, a1                ; a1 = ptr to desc variable
  143.             clr.l (a1)                    ; 
  144.  
  145. @loop        cmp.l (a0)+, d0                ; selector found?
  146.             beq @found                    ; 
  147.             tst.l (a0)+                    ; at the end of the table?
  148.             bne.s @loop                    ; 
  149.             bra.s @exit                    ; 
  150.  
  151. @found        move.l (a0), (a1)            ; copy descriptor record
  152. @exit
  153.     }
  154.  
  155. #else
  156.  
  157.     for ( ; table->selector != selector ; table++ )
  158.         if ( * (long *) &(table->desc) == 0L )
  159.             break;
  160.     
  161.     *desc = table->desc;
  162.  
  163. #endif
  164.  
  165. }
  166.  
  167. pascal OSErr _WEGetField(/*const*/ WELookupTable *table, OSType selector, long *info, void *structure)
  168. {
  169.     WEFieldDescriptor desc;
  170.     
  171.     _WELookupSelector(table, selector, &desc);
  172.     
  173.     if (desc.fLength == 0)
  174.         return weUndefinedSelectorErr;
  175.     
  176.     *info = * (long *) ((long) structure + desc.fOffset);
  177.     return noErr;
  178. }
  179.  
  180. pascal OSErr _WESetField(/*const*/ WELookupTable *table, OSType selector, long *info, void *structure)
  181. {
  182.     WEFieldDescriptor desc;
  183.     
  184.     _WELookupSelector(table, selector, &desc);
  185.     
  186.     if (desc.fLength == 0)
  187.         return weUndefinedSelectorErr;
  188.     
  189.     * (long *) ((long) structure + desc.fOffset) = *info;
  190.     return noErr;
  191. }